# 检查 CMake 版本是否大于等于 3.12.0
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0)
    # CMake 3.12.0 及以上版本使用新的 Python3 模块，该模块比旧的 PythonInterp 更健壮
    find_package(Python3 COMPONENTS Interpreter)
    # 设置变量以兼容 CMake 版本小于 3.12.0 的情况
    set(PYTHONINTERP_FOUND ${Python3_Interpreter_FOUND})
    set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
else()
    # 为旧版本 CMake 指定额外的 Python 版本，这里指定为 3.8
    set(Python_ADDITIONAL_VERSIONS 3.8)
    # 使用旧的 PythonInterp 模块查找 Python 3
    find_package(PythonInterp 3)
endif()

# 创建一个可执行文件目标 jsontestrunner_exe，使用 main.cpp 源文件
add_executable(jsontestrunner_exe
    main.cpp
)

# 检查是否启用了构建共享库的选项
if(BUILD_SHARED_LIBS)
    if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0)
        # CMake 3.12.0 及以上版本使用新语法定义宏 JSON_DLL
        add_compile_definitions( JSON_DLL )
    else()
        # 旧版本 CMake 使用旧语法定义宏 JSON_DLL
        add_definitions(-DJSON_DLL)
    endif()
    # 将 jsontestrunner_exe 可执行文件与共享库 jsoncpp_lib 链接
    target_link_libraries(jsontestrunner_exe jsoncpp_lib)
else()
    # 将 jsontestrunner_exe 可执行文件与静态库 jsoncpp_static 链接
    target_link_libraries(jsontestrunner_exe jsoncpp_static)
endif()

# 设置 jsontestrunner_exe 目标的输出文件名为 jsontestrunner_exe
set_target_properties(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)

# 检查是否找到了 Python 解释器
if(PYTHONINTERP_FOUND)
    # 定义端到端解析器/写入器测试的测试目录
    set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../test)
    # 定义运行测试的 Python 脚本路径
    set(RUNJSONTESTS_PATH ${TEST_DIR}/runjsontests.py)

    # 在构建后运行单元测试
    # （默认的 CMake 工作流程会将测试结果隐藏在文件中，导致开发体验不佳）
    add_custom_target(jsoncpp_readerwriter_tests
        # 使用找到的 Python 解释器执行测试脚本，传入可执行文件路径和测试数据目录
        "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
        # 该自定义目标依赖于 jsontestrunner_exe 和 jsoncpp_test 目标
        DEPENDS jsontestrunner_exe jsoncpp_test
    )
    # 创建一个名为 jsoncpp_check 的自定义目标，依赖于 jsoncpp_readerwriter_tests 目标
    add_custom_target(jsoncpp_check DEPENDS jsoncpp_readerwriter_tests)

    ## 创建用于仪表盘提交的测试，方便在 CI 结果中查看，例如 https://my.cdash.org/index.php?project=jsoncpp
    # 创建一个名为 jsoncpp_readerwriter 的测试
    add_test(NAME jsoncpp_readerwriter
        # 测试命令为使用 Python 解释器执行测试脚本，传入可执行文件路径和测试数据目录
        COMMAND "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
        # 设置测试的工作目录为测试数据目录
        WORKING_DIRECTORY "${TEST_DIR}/data"
    )
    # 创建一个名为 jsoncpp_readerwriter_json_checker 的测试
    add_test(NAME jsoncpp_readerwriter_json_checker
        # 测试命令为使用 Python 解释器执行测试脚本，并带上 --with-json-checker 选项
        COMMAND "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" --with-json-checker  $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
        # 设置测试的工作目录为测试数据目录
        WORKING_DIRECTORY "${TEST_DIR}/data"
    )
endif()
